<!DOCTYPE html>
<html lang="zh-Hans">

<!-- Head tag -->
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">

    <!--Description-->
    
        <meta name="description" content="Note">
    

    <!--Author-->
    
        <meta name="author" content="兰陵忧患生">
    

    <!-- Title -->
    
    <title>Java 并发编程的艺术 | Lan</title>

    <!-- Bootstrap Core CSS -->
    <link href="//cdn.bootcss.com/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet">
    <link rel="stylesheet"
      href="//cdn.jsdelivr.net/gh/highlightjs/cdn-release@9.12.0/build/styles/default.min.css">
    <script src="//cdn.jsdelivr.net/gh/highlightjs/cdn-release@9.12.0/build/highlight.min.js"></script>

    <!-- Custom CSS -->
    <link rel="stylesheet" href="/css/style.css">

    <!-- Custom Fonts -->
    <link href="//cdn.bootcss.com/font-awesome/4.5.0/css/font-awesome.min.css" rel="stylesheet" type="text/css">
    <link href='//fonts.googleapis.com/css?family=Lora:400,700,400italic,700italic' rel='stylesheet' type='text/css'>
    <link href='//fonts.googleapis.com/css?family=Open+Sans:300italic,400italic,600italic,700italic,800italic,400,300,600,700,800' rel='stylesheet' type='text/css'>

    <!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
    <!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
    <!--[if lt IE 9]>
    <script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
    <script src="https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script>
    <![endif]-->
</head>

<body>

    <!-- Content -->
    <section class="article-container">
<!-- Back Home -->
<a class="nav-back" href="/">
    <i class="fa fa-puzzle-piece"></i>
</a>

<!-- Page Header -->
<header class="intro-header">
    <div class="container">
        <div class="row">
            <div class="col-lg-8 col-lg-offset-2 col-md-10 col-md-offset-1">
                <div class="post-heading">
                    <h1>Java 并发编程的艺术</h1>
                </div>
            </div>
        </div>
    </div>
</header>

<!-- Post Content -->
<article>
    <div class="container">
        <div class="row">
            <!-- TOC -->
            <div class="toc-article col-lg-8 col-lg-offset-2 col-md-10 col-md-offset-1">
    <ol class="toc"><li class="toc-item toc-level-2"><a class="toc-link" href="#并发编程的挑战"><span class="toc-text">并发编程的挑战</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#上下文切换"><span class="toc-text">上下文切换</span></a><ol class="toc-child"><li class="toc-item toc-level-4"><a class="toc-link" href="#如何减少上下文切换"><span class="toc-text">如何减少上下文切换</span></a></li></ol></li><li class="toc-item toc-level-3"><a class="toc-link" href="#死锁"><span class="toc-text">死锁</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#资源限制的挑战"><span class="toc-text">资源限制的挑战</span></a></li></ol></li><li class="toc-item toc-level-2"><a class="toc-link" href="#Java-并发机制的底层实现原理"><span class="toc-text">Java 并发机制的底层实现原理</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#volatile-的应用"><span class="toc-text">volatile 的应用</span></a></li></ol></li></ol>
</div>

            <!-- Post Main Content -->
            <div class="post-content col-lg-8 col-lg-offset-2 col-md-10 col-md-offset-1">
                <h2 id="并发编程的挑战"><a href="#并发编程的挑战" class="headerlink" title="并发编程的挑战"></a>并发编程的挑战</h2><h3 id="上下文切换"><a href="#上下文切换" class="headerlink" title="上下文切换"></a>上下文切换</h3><h4 id="如何减少上下文切换"><a href="#如何减少上下文切换" class="headerlink" title="如何减少上下文切换"></a>如何减少上下文切换</h4><ul>
<li>无锁并发编程</li>
<li><p>CAS 算法</p>
<ul>
<li>Java 的 Atomic 包使用 CAS 算法来更新数据，而不需要枷锁。</li>
</ul>
</li>
<li><p>使用最少线程</p>
</li>
<li><p>协程</p>
<ul>
<li>在单线程里实现多任务的调度，并在单线程里维持多个任务间的切换。</li>
</ul>
</li>
</ul>
<h3 id="死锁"><a href="#死锁" class="headerlink" title="死锁"></a>死锁</h3><ul>
<li><p>避免死锁的常见方法</p>
<ul>
<li>避免一个线程同时获取多个锁。</li>
<li>避免一个线程在锁内同时占用多个资源，尽量保证每个锁占用一个资源。</li>
<li>尝试使用定时锁，使用 <code>lock.tryLock(timeout)</code> 来替代使用内部锁机制。</li>
<li>对于数据库锁，加锁和解锁必须在一个数据库连接里，否则会出现解锁失败的情况。</li>
</ul>
</li>
</ul>
<h3 id="资源限制的挑战"><a href="#资源限制的挑战" class="headerlink" title="资源限制的挑战"></a>资源限制的挑战</h3><h2 id="Java-并发机制的底层实现原理"><a href="#Java-并发机制的底层实现原理" class="headerlink" title="Java 并发机制的底层实现原理"></a>Java 并发机制的底层实现原理</h2><ul>
<li>Java 代码在编译后会变成 Java 字节码，字节码被类加载到 JVM 里，JVM 里，JVM 执行字节码，最终需要转化为汇编指令在 CPU 上执行，Java 中所有使用的并发机制依赖于 JVM 的实现和 CPU 的指令。</li>
</ul>
<h3 id="volatile-的应用"><a href="#volatile-的应用" class="headerlink" title="volatile 的应用"></a>volatile 的应用</h3><ul>
<li>术语</li>
</ul>
<table>
<thead>
<tr>
<th>术语</th>
<th>En</th>
<th>术语描述</th>
</tr>
</thead>
<tbody>
<tr>
<td>内存屏障</td>
<td>memory barriers</td>
<td>一组处理器指令，用于实现对内存操作的顺序限制。</td>
</tr>
<tr>
<td>缓冲行</td>
<td>cache line</td>
<td>缓冲中可以分配的最小存储单元。处理器填写缓存线时会加载整个缓存线，需要使用多个主内存存读周期</td>
</tr>
<tr>
<td>原子操作</td>
<td>atomic operations</td>
<td>不可中断的一个或一系列操作</td>
</tr>
<tr>
<td>缓冲行填充</td>
<td>cache line fill</td>
<td>当处理器识别到从内存中读取操作数是可缓存的，处理器读取整个缓存行到适当的缓存。（L1，L2，L3 的或所有）</td>
</tr>
<tr>
<td>缓存命中</td>
<td>cache hit</td>
<td>如果进行高速缓存行填充操作的内存位置仍然是下次处理器访问的地址时，处理器从缓存中读取操作数而不是从内存读取。</td>
</tr>
<tr>
<td>写命中</td>
<td>write hit</td>
<td>当处理器将操作数写回到一个内存缓存的区域时，它首先会检查这个缓存的内存地址是否在缓存中，如果存在一个有效的缓存行，则处理器将这个操作数写回到缓存，而不是写回到内存。</td>
</tr>
<tr>
<td>写缺失</td>
<td>write misses the cache</td>
<td>一个有效的缓存行被写入到不存在的内存区域</td>
</tr>
</tbody>
</table>
<ul>
<li><p>缓存一致性协议</p>
</li>
<li><p>volatile 两条实现原则</p>
<ul>
<li><p>Lock 前缀指令会引起处理缓存会写到内存。</p>
<ul>
<li>在多处理器环境中，LOCK# 信号确保在声言该信号期间，处理器可以独占任何共享内存。</li>
<li>LOCK# 信号一般不锁总线，而是锁缓存，毕竟锁总线开销的比较大。</li>
<li>但在 P6 和目前的处理器中，如果访问的内存区域已经缓存在处理器内部，则不会声言 LOCK# 信号。</li>
<li>相反，它会锁定这块内存区域的缓存并回写到内存，并使用缓存一致性机制来确保修改的原子性（缓存锁定）</li>
<li>缓存一致性机制会阻止同时修改由两个以上处理器缓存的内存区域数据。</li>
</ul>
</li>
<li><p>一个处理器的缓存回写到内存会导致其他处理器的缓存无效。</p>
<ul>
<li>处理器使用嗅探技术保证他的内部缓存，系统内存和其他处理器的缓存的数据在总线上保持一致。</li>
</ul>
</li>
</ul>
</li>
<li><p>volatile 的使用优化</p>
</li>
</ul>

 
                <!-- Meta -->
                <div class="post-meta">
                    <hr>
                    <br>
                    <div class="post-tags">
                        
                            

<a href="/tags/Java/">#Java</a>


                        
                    </div>
                    <div class="post-date">
                        2017 年 10 月 13 日
                    </div>
                </div>
            </div>

            <!-- Comments -->
            <div class="col-lg-8 col-lg-offset-2 col-md-10 col-md-offset-1">
                <!-- Disqus Comments -->


            </div>
        </div>
    </div>
</article>
</section>

    <!-- Scripts -->
    <!-- jQuery -->
<script src="//cdn.bootcss.com/jquery/2.2.1/jquery.min.js"></script>
<!-- Bootstrap -->
<script src="//cdn.bootcss.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>

<script type="text/javascript">
	hljs.initHighlightingOnLoad();
	console.log('Hexo-theme-hollow designed by zchen9 http://www.chen9.info © 2015-' + (new Date()).getFullYear());
</script>

    <!-- Google Analytics -->
    

</body>

</html>